#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>

#include "proto.h"

int main(int argc,char* argv[])
{
    //修改1：添加 name 字段 
    if(argc < 3)
    {
        fprintf(stderr,"%s ipaddress message.\n",argv[0]);
        exit(1);
    }

    if(strlen(argv[2]) > NAMEMAX)
    {
        fprintf(stderr,"message is too long.\n");
        exit(1);
    }

    // 1、使用SOCKET来创建套接字
    int sd;
    int size;
    //修改2：将要发送的信息的地址需要修改成指针
    struct msg_st* psbuf;
    struct sockaddr_in raddr;
    
    //给要发送的信息申请空间
    //申请多大空间呢
    size = sizeof(struct msg_st)+strlen(argv[2]);    
    psbuf = malloc(size);
    if(psbuf == NULL)
    {   
        fprintf(stderr,"malloc fail.\n");
        exit(1);
    }   

    sd = socket(AF_INET,SOCK_DGRAM,0);//这里相当于是用IPv4协议族中的IPPROTO_UDP来实现SOCK_DGRAM的操作
    if(sd < 0)
    {   
        perror("socket()");
        exit(1);
    }   
    
    // 2、给SOCKET取得地址（可省略）

    // 3、收/发消息
    // 字符串,不能直接使用"=",应该使用strcpy函数。
    strcpy(psbuf->name, argv[2]);
    psbuf->math = htonl(rand()%100);
    psbuf->chinese = htonl(rand()%100);

    raddr.sin_family = AF_INET;
    raddr.sin_port = htons(atoi(RCVPORT));//对端的端口
    inet_pton(AF_INET,argv[1],&raddr.sin_addr.s_addr);

    if(sendto(sd,psbuf,size,0,(void *)&raddr,sizeof(raddr))<0)
    {
        perror("sendto()");
        exit(1);
    }

    puts("OK!\n");

    // 4、关闭SOCKET
    close(sd);

    return 0;
}

